/**
 * 这里讨论一个比较古怪的类型-nevertype,实际上就是没有指
 * 内容包括：
 * 1.含义  -- 永远不存在的值的类型

 * 2.如何定义  ！,一个感叹号
 * 3.有什么用处
 * a.用在类型守卫中，排除所有可能性
 *    所谓类型守卫(type guard)-允许在运行时检查值的类型，并根据类型采取不同的行动。主要通过match和!来执行
 * b.用在函数中，表示一个永远不存在的值   -- 不知道这个又有什么用处
 * c.用在类型推断中，表示一个永远不存在的值  -- 不知道这个又有什么用处
 * 
 * 总结起来，把永不类型当作一个标记即可，看到这个永不类型，即意味着：死循环，错误，能够让某些语句得以通过编译
 * 4.示例
 */

#[allow(unreachable_code)]
fn main() {
    // 示例1：在循环中正确使用 continue
    println!("示例1：解析数字");
    loop {
        let guess = "42";
        let guess: u32 = match guess.trim().parse() {
            Ok(num) => {
                println!("成功解析数字：{}", num);
                num
            }
            Err(_) => {
                println!("解析失败，继续下一次循环");
                continue;
            }
        };
        println!("你猜的数字是：{}", guess);
        break; // 成功解析后退出循环
    }

    // 示例2：演示永不类型在错误处理中的应用
    println!("\n示例2：调用返回永不类型的函数");
    println!("准备调用操蛋()函数...");
    退出程序(); // 这行之后的代码永远不会执行
    操蛋(); // 这行之后的代码永远不会执行
    无限循环(); // 这行之后的代码永远不会执行
    // 这行代码永远不会被执行
    println!("这条消息永远不会被打印");
}

// 返回永不类型的函数示例1：通过panic实现
fn 操蛋() -> ! {
    panic!("永远不存在的值")
}

// 返回永不类型的函数示例2：通过无限循环实现
fn 无限循环() -> ! {
    loop {
        std::thread::sleep(std::time::Duration::from_secs(1));
        println!("永远循环中...");
    }
}

// 返回永不类型的函数示例3：通过进程退出实现
fn 退出程序() -> ! {
    std::process::exit(0);
}
